Warning: mkdir(): No space left on device in /var/www/tg-me/post.php on line 37

Warning: file_put_contents(aCache/aDaily/post/csharp_ci/--): Failed to open stream: No such file or directory in /var/www/tg-me/post.php on line 50
C# (C Sharp) programming | Telegram Webview: csharp_ci/1334 -
Telegram Group & Telegram Channel
💡 Задача: Загадочный Кэш

У тебя есть метод, который возвращает последовательность чисел, вычисляемую с задержкой (например, чтение из удалённого ресурса):


public static IEnumerable<int> GetSlowData()
{
Console.WriteLine("Fetching data...");
yield return 1;
Thread.Sleep(1000);
yield return 2;
Thread.Sleep(1000);
yield return 3;
}

Теперь тебе нужно реализовать метод ProcessData(), который:

Вызывает GetSlowData() один раз.

Проходит по данным дважды: сначала фильтрует только чётные, потом считает сумму всех.

Не должен повторно "запрашивать" данные (то есть Fetching data... должен выводиться один раз).

Не должен использовать ToList(), ToArray() или другие методы, загружающие всё в память явно.

🧠 Вопрос с подвохом: Как реализовать ProcessData()?
Напиши реализацию:


public static void ProcessData()
{
// твой код здесь
}


🔎 Подсказка
Если ты просто используешь IEnumerable<int> и дважды к нему обращаешься — будет два запроса. Но есть один способ реализовать ленивое кэширование, не загружая всё в память сразу и не повторяя yield return.

Решение:

Если ты просто напишешь вот так:

```csharp
var data = GetSlowData();

var evens = data.Where(x => x % 2 == 0);
var sum = data.Sum();```

то GetSlowData() будет вызван дважды, потому что IEnumerable ленивый — и при каждом новом foreach начинается всё заново. Это видно по двойному выводу Fetching data....

🧠 Цель: пройтись по данным один раз, кэшируя элементы "на лету", и позволить другим перечислениям работать без повторного получения.
Решение: Используем ленивый кеш — с помощью кастомного итератора

```csharp
public static void ProcessData()
{
var cached = new MemoizedEnumerable<int>(GetSlowData());

var evens = cached.Where(x => x % 2 == 0);
var sum = cached.Sum();

Console.WriteLine("Even numbers: " + string.Join(", ", evens));
Console.WriteLine("Sum: " + sum);
}```
А вот реализация ленивого кеширующего MemoizedEnumerable<T>:

```csharp
public class MemoizedEnumerable<T> : IEnumerable<T>
{
private readonly IEnumerator<T> _source;
private readonly List<T> _cache = new();
private bool _sourceFinished = false;

public MemoizedEnumerable(IEnumerable<T> source)
{
_source = source.GetEnumerator();
}

public IEnumerator<T> GetEnumerator()
{
int index = 0;
while (true)
{
if (index < _cache.Count)
{
yield return _cache[index];
}
else
{
if (_sourceFinished || !_source.MoveNext())
{
_sourceFinished = true;
yield break;
}

_cache.Add(_source.Current);
yield return _source.Current;
}
index++;
}
}

IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}```

🧪 Что происходит
MemoizedEnumerable запоминает каждый элемент один раз при первом проходе.

Следующие проходы используют кэш.

Fetching data... будет вызван только один раз.

💥 Подвох
Большинство подумает, что IEnumerable можно безопасно переиспользовать без сайд-эффектов. Но не тут-то было: без кэширования yield выполнится дважды. Многие Middle+ разработчики ошибаются именно тут.



tg-me.com/csharp_ci/1334
Create:
Last Update:

💡 Задача: Загадочный Кэш

У тебя есть метод, который возвращает последовательность чисел, вычисляемую с задержкой (например, чтение из удалённого ресурса):


public static IEnumerable<int> GetSlowData()
{
Console.WriteLine("Fetching data...");
yield return 1;
Thread.Sleep(1000);
yield return 2;
Thread.Sleep(1000);
yield return 3;
}

Теперь тебе нужно реализовать метод ProcessData(), который:

Вызывает GetSlowData() один раз.

Проходит по данным дважды: сначала фильтрует только чётные, потом считает сумму всех.

Не должен повторно "запрашивать" данные (то есть Fetching data... должен выводиться один раз).

Не должен использовать ToList(), ToArray() или другие методы, загружающие всё в память явно.

🧠 Вопрос с подвохом: Как реализовать ProcessData()?
Напиши реализацию:


public static void ProcessData()
{
// твой код здесь
}


🔎 Подсказка
Если ты просто используешь IEnumerable<int> и дважды к нему обращаешься — будет два запроса. Но есть один способ реализовать ленивое кэширование, не загружая всё в память сразу и не повторяя yield return.

Решение:

Если ты просто напишешь вот так:

```csharp
var data = GetSlowData();

var evens = data.Where(x => x % 2 == 0);
var sum = data.Sum();```

то GetSlowData() будет вызван дважды, потому что IEnumerable ленивый — и при каждом новом foreach начинается всё заново. Это видно по двойному выводу Fetching data....

🧠 Цель: пройтись по данным один раз, кэшируя элементы "на лету", и позволить другим перечислениям работать без повторного получения.
Решение: Используем ленивый кеш — с помощью кастомного итератора

```csharp
public static void ProcessData()
{
var cached = new MemoizedEnumerable<int>(GetSlowData());

var evens = cached.Where(x => x % 2 == 0);
var sum = cached.Sum();

Console.WriteLine("Even numbers: " + string.Join(", ", evens));
Console.WriteLine("Sum: " + sum);
}```
А вот реализация ленивого кеширующего MemoizedEnumerable<T>:

```csharp
public class MemoizedEnumerable<T> : IEnumerable<T>
{
private readonly IEnumerator<T> _source;
private readonly List<T> _cache = new();
private bool _sourceFinished = false;

public MemoizedEnumerable(IEnumerable<T> source)
{
_source = source.GetEnumerator();
}

public IEnumerator<T> GetEnumerator()
{
int index = 0;
while (true)
{
if (index < _cache.Count)
{
yield return _cache[index];
}
else
{
if (_sourceFinished || !_source.MoveNext())
{
_sourceFinished = true;
yield break;
}

_cache.Add(_source.Current);
yield return _source.Current;
}
index++;
}
}

IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}```

🧪 Что происходит
MemoizedEnumerable запоминает каждый элемент один раз при первом проходе.

Следующие проходы используют кэш.

Fetching data... будет вызван только один раз.

💥 Подвох
Большинство подумает, что IEnumerable можно безопасно переиспользовать без сайд-эффектов. Но не тут-то было: без кэширования yield выполнится дважды. Многие Middle+ разработчики ошибаются именно тут.

BY C# (C Sharp) programming


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/csharp_ci/1334

View MORE
Open in Telegram


C C Sharp programming Telegram | DID YOU KNOW?

Date: |

How To Find Channels On Telegram?

There are multiple ways you can search for Telegram channels. One of the methods is really logical and you should all know it by now. We’re talking about using Telegram’s native search option. Make sure to download Telegram from the official website or update it to the latest version, using this link. Once you’ve installed Telegram, you can simply open the app and use the search bar. Tap on the magnifier icon and search for a channel that might interest you (e.g. Marvel comics). Even though this is the easiest method for searching Telegram channels, it isn’t the best one. This method is limited because it shows you only a couple of results per search.

How to Use Bitcoin?

n the U.S. people generally use Bitcoin as an alternative investment, helping diversify a portfolio apart from stocks and bonds. You can also use Bitcoin to make purchases, but the number of vendors that accept the cryptocurrency is still limited. Big companies that accept Bitcoin include Overstock, AT&T and Twitch. You may also find that some small local retailers or certain websites take Bitcoin, but you’ll have to do some digging. That said, PayPal has announced that it will enable cryptocurrency as a funding source for purchases this year, financing purchases by automatically converting crypto holdings to fiat currency for users. “They have 346 million users and they’re connected to 26 million merchants,” says Spencer Montgomery, founder of Uinta Crypto Consulting. “It’s huge.”

C C Sharp programming from es


Telegram C# (C Sharp) programming
FROM USA